/*
 *    This program is free software; you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation; either version 2 of the License, or
 *    (at your option) any later version.
 *
 *    This program is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with this program; if not, write to the Free Software
 *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *    2011 year
 *    Author: Michael Khromov aka MikeDM (Mike D'Morto)
 *    E-Mail: mikedmorto@gmail.com
 */

#ifndef DBWORKER_H
#define DBWORKER_H
#define TH "libdb_mysql_worker"

#include <QThread>
#include <QString>
#include "libdbmysql_data.h"


// структура хранения запроса метафункций
struct MFitem{
    QString pl_name, mfname;
    QStringList params;
};

class dbworker : public QThread
{
    Q_OBJECT
private:
    // параметры соединения.
    QString dhost, dsocket, dname, duser, dpass;
    int dport;
    // указатель на будущий фрагмент данных
    libdbmysql_data * data;
    // а вот и вектор данных для хранения такого рода данных
    QList<libdbmysql_data*> datalist;
    // флаги
    // флаг остановки потока
    bool stop;
    // текст последней ошибки
    QString lastError;
    // список асинхронных запростов
    QList<MFitem*> mflist;
    // список всех полученных данных отдаваемых наружу
    QMap<int,Mdata*> resultList;

    void run();
    // подстраховываемся на предмет мускуль инъекций. опасные штуки блин, это не прививка -)
    QString sqlsafe(const QString & srt);
public:
    explicit dbworker(const QString dbhost,
                      int dbport,
                      const QString dbsocket,
                      const QString dbname,
                      const QString dbuser,
                      const QString dbpass ,
                      QObject *parent = 0);
    // возвращаем последнюю ошибку
    QString getLastError();
    // рабочие методы
    // остановить поток
    void stopT();

    // метод постановки в очередь метафункции асинхронный режим
    void putMFun(MFitem * queryitem);
    // очищаем данные
    void freeRes(int id);
    // тоже для синхронного режима




signals:
    // сигналим в лог
    void sigPutLog(const QString & owner, int level, const QString &text);
    // сигналим инициализацию
    void sigInit(bool init);
    // сигнал об ошибке
    void sigError(const QString & pl_name, const QString & errtext);
    // сигнал о завершенном запросе
    void sigFinish(const QString & pl_name,int id, Mdata * data);

public slots:

};

#endif // DBWORKER_H

